package com.roin.learn.springmvc.datasource;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.core.Ordered;
/**
 * 
 * AOP通知类，我们要在方法执行以前先切换数据源
 * 
 * @author 罗毅
 * @version 1.0,2017年5月31日 下午3:08:39
 * @since learn-springmvc 0.0.1
 */
public class DataSourceAdvice implements MethodBeforeAdvice,Ordered {

	@Override
	public void before(Method method, Object[] args, Object target) throws Throwable {
		BiDSChoicer annotation = method.getAnnotation(BiDSChoicer.class);  
	    if (annotation != null)  
	    	MultipleDataSource.setDataSourceKey(annotation.dsName());  
	    else  
	    	MultipleDataSource.toDefault();  
	}

	/**
	 * 由于接口实现配置了事务管理，事务的优先级会高于数据源切换。一旦事务开启，再切换数据源是无效的，所以这里需要修改它们的次序，并在spring配置文件的事务配置中增加order为2
	 * @return
	 * @since learn-springmvc 0.0.1
	 */
	@Override
	public int getOrder() {
		return 1;
	}

}
